草庐IT

TypeScript 运算符

全部标签

c++ - 将对象传递给重载运算符

昨天有人给了我一个有错误的程序。在MVS2010中工作时,我发现了问题及其替代方案。问题是类的重载插入运算符。它的原型(prototype)如下……voidmatrix::operator它是从这样的地方调用的......matrixm;m.operator我发现编译器不允许发送相同的对象作为调用函数的引用参数。但我不明白这背后的原因,也不知道它会产生什么问题。如果有人能解释一下,我将不胜感激。谢谢。编辑:实际发生的事情是,在调试时,它进入函数内部,出来并在main执行时进入外部依赖文件dbgdel.cpp并在此停止行。_ASSERTE(_BLOCK_TYPE_IS_VALID(pHe

c++ - 为什么指针类型的内置关系运算符不在 C++ 中生成总顺序?

我知道指针的关系运算符仅在有限的情况下提供可靠的结果,并且不能保证它们生成总顺序。但是,这些运算符的标准函数对象确实具有生成总顺序的特化。那么是什么阻止了对内置运算符应用相同的规则呢?这似乎并没有简化任何事情,因为仍然需要可靠的比较(通过一些特定于实现的方法)才能使这些函数对象起作用。此外,仅使用内置运算符是否可以对指针进行可靠比较?虽然看起来不可能,但我想在这里确认一下。 最佳答案 并不是说他们不生成总订单,只是不能保证他们会这样做。实际上,它们通常会在大多数现代硬件上服从总排序。只是标准无法保证。当然,一个实现总是可以强制他们这

c++ - 为什么 == 运算符重载枚举在 MSVC 中不明确

除了MSVC,以下代码在我检查过的所有编译器(clang、mingw、g++)上都能正常编译。enumclassFoo{BAR};booloperator==(Fooa,Foob){return(int)a&(int)b;}intmain(intargc,char*argv[]){Foo::BAR==Foo::BAR;return0;}MSVC失败并出现以下错误:>main.cpp(10):errorC2593:'operator=='isambiguous>main.cpp(3):note:couldbe'booloperator==(Foo,Foo)'>main.cpp(10):n

c++ - "laundry"是通过指针运算传播的吗?

如P0532R0中所述,在以下用例中,必须使用std::launder来避免未定义的行为(UB):structX{constinti;x(inti):i{i}{}};unsignedcharbuff[64];autop=new(buff)X(33);p->~X();new(buff)X(42);p=std::launder(p);assert(p->i==42);但是如果缓冲区上有多个对象会发生什么(这正是如果将2个X压入一个vector,清除该vector然后压入两个新的X):unsignedcharbuff[64];autop0=new(buff)X(33);autop1=new(

c++ - C 和 C++ 中前缀递增运算符的区别

我刚刚阅读了Creferenceaboutprefixincrementoperator并意识到前缀增量运算符的结果不是左值,但令人惊讶的是它在C++中是左值。之后我读了thisanswer这解释了为什么它是左值,但我不明白:(Line3):["]itappearsthatitissoyoucantakeitsaddressorassigntoareference.[."]例子如下:inti;externvoidf(int*p);f(&++i);/*WouldbeillegalC,butCprogrammershaventmissedthisfeature*/...那么允许这样做有什么

c++ - 为什么 static_cast 不使用转换运算符指向 const 的指针?

来self的包装类Pointer我只想返回指向const的指针:Baseconst*.类型转换时Pointer至Derivedconst*我收到一个编译错误:errorC2440:'static_cast':'Pointer'cannotbeconvertedto'constDerived*'(译自德语VS2012)structBase{};structDerived:publicBase{};templateclassPointer{public:Pointer(T*t=nullptr):p(t){}//operatorT*(){returnp;}operatorTconst*()c

c++ - 运算符重载 C++ 中的友元函数与成员函数

之前,我学习了如何将C++中的运算符重载为类的成员函数和友元函数。虽然,我知道如何使用这两种技术在C++中重载运算符。但我仍然很困惑**哪个更好**?重载运算符的成员函数或友元函数,我应该使用哪个,为什么?请指导我!非常感谢您的回复。我将很高兴并感谢您的回答。 最佳答案 选择不是“成员(member)或friend”,而是“成员(member)或非成员(member)”。(友元经常被过度使用,而且通常在学校过早地教授。)这是因为您总是可以添加一个自由函数可以调用的公共(public)成员函数。例如:classA{public:exp

c++ - msvc/permissive- std::string 重载运算符 '=' 不明确

它用/permissive编译,但用/permissive-编译失败。什么不符合要求以及如何解决?为什么在(2)中没问题,但在(4)(3)中失败了?如果我删除operatorlong也可以。如何在不更改调用站点(3,4)的情况下修复它?#includestructmy{std::stringmyVal;my(std::stringval):myVal(val){}operatorstd::string(){returnmyVal;};operatorlong(){returnstd::stol(myVal);};};intmain(){structMyStruct{longn=my("

c++ - 运算符 () 重载模板 C++

我有一个简单的类,我想如下重载运算符classMyClass{public:intfirst;templateToperator()()const{returnfirst;}};还有我的其他地方MyClassobj;inti=obj();//Thisgivesmeanerrorsayingcouldnotdeduce//templateargumentforT谁能帮我解决这个错误,非常感谢。谢谢。编辑:这与operator()有关,例如,如果我将函数替换为templateTget()const{returnfirst;}它有效。感谢所有回复。 最佳答案

c++ - 为 std::tuple 重载运算符 << - 可能的简化?

我用了ananswertotheSOquestion"iterateovertuple"编写一个方法来重载.此方法已经过测试,似乎可以与g++4.7一起正常工作。在Debian挤压上。然而,这种方法有点迂回,因为看起来不能显式实例化(我找到了一篇关于它的帖子here).因此,人们被迫定义一个字符串方法然后调用它。vector我有类似的方法,比较直接。有没有人对如何消除使用相同方法或其他方式创建字符串方法的额外步骤提出建议?提前致谢。#include#include#include#include#includeusingstd::ostream;usingstd::cout;using